package utils

import (
	"bytes"
	"encoding/xml"
	"fmt"
	"os"
	"strings"
)

// XmlFileReadXMLConfig 读取 XML 配置文件
func XmlFileReadXMLConfig[C any](filename string) (*C, error) {
	// 读取文件内容
	data, err := os.ReadFile(filename)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %v", err)
	}

	// 创建 Config 结构体实例
	var config C

	// 解析 XML
	err = xml.Unmarshal(data, &config)
	if err != nil {
		return nil, fmt.Errorf("解析 XML 失败: %v", err)
	}

	return &config, nil
}

// XmlFileWriteXMLConfig 将配置写入 XML 文件，支持自定义属性
func XmlFileWriteXMLConfig[C any](filename string, config *C, attrs map[string]string) error {
	var buf bytes.Buffer
	encoder := xml.NewEncoder(&buf)
	encoder.Indent("", "  ")

	// 编码配置
	if err := encoder.Encode(config); err != nil {
		return fmt.Errorf("生成 XML 失败: %v", err)
	}

	// 获取编码后的 XML
	xmlData := buf.Bytes()

	// 构建自定义属性字符串
	var attrStrings []string
	for key, value := range attrs {
		attrStrings = append(attrStrings, fmt.Sprintf(`%s="%s"`, key, value))
	}
	attrString := strings.Join(attrStrings, " ")

	// 在根元素中插入自定义属性
	xmlString := string(xmlData)
	index := strings.Index(xmlString, ">")
	if index != -1 {
		xmlString = xmlString[:index] + " " + attrString + xmlString[index:]
	}

	// 添加 XML 头
	finalXML := xml.Header + xmlString

	// 写入文件
	err := os.WriteFile(filename, []byte(finalXML), 0644)
	if err != nil {
		return fmt.Errorf("写入配置文件失败: %v", err)
	}

	return nil
}
